/**
 * 日期格式化工具函数集
 * 参照原项目 parseTime 函数，使用原生 JavaScript 实现，无第三方依赖
 */

/**
 * 通用日期解析函数（参照原项目 parseTime）
 * @param time 时间值
 * @param pattern 格式模式
 * @returns 格式化后的日期字符串
 */
export function parseTime(time: any, pattern?: string): string {
  if (arguments.length === 0 || !time) {
    return "-";
  }
  
  const format = pattern || "{y}-{m}-{d} {h}:{i}:{s}";
  let date: Date;
  
  if (typeof time === "object") {
    date = time;
  } else {
    if (typeof time === "string" && /^[0-9]+$/.test(time)) {
      time = parseInt(time);
    } else if (typeof time === "string") {
      time = time
        .replace(new RegExp(/-/gm), "/")
        .replace("T", " ")
        .replace(new RegExp(/\.[\d]{3}/gm), "");
    }
    if (typeof time === "number" && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay(),
  };
  
  const timeStr = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key as keyof typeof formatObj];
    // Note: getDay() returns 0 on Sunday
    if (key === "a") {
      return ["日", "一", "二", "三", "四", "五", "六"][value];
    }
    if (result.length > 0 && value < 10) {
      value = "0" + value;
    }
    return value || 0;
  });
  
  return timeStr;
}

/**
 * 格式化日期
 * @param date 日期值
 * @param format 格式字符串 (可选：YYYY-MM-DD, YYYY-MM-DD HH:mm:ss 等)
 * @returns 格式化后的日期字符串
 */
export function formatDate(date: any, format: string = "YYYY-MM-DD"): string {
  if (!date) return "-";

  try {
    // 转换格式字符串为 parseTime 格式
    const pattern = format
      .replace(/YYYY/g, "{y}")
      .replace(/MM/g, "{m}")
      .replace(/DD/g, "{d}")
      .replace(/HH/g, "{h}")
      .replace(/mm/g, "{i}")
      .replace(/ss/g, "{s}");
    
    return parseTime(date, pattern);
  } catch (error) {
    console.warn("日期格式化失败:", error);
    return String(date);
  }
}

/**
 * 格式化日期时间
 * @param date 日期值
 * @returns 格式化后的日期时间字符串
 */
export function formatDateTime(date: any): string {
  return formatDate(date, "YYYY-MM-DD HH:mm:ss");
}

/**
 * 格式化时间
 * @param date 日期值
 * @returns 格式化后的时间字符串
 */
export function formatTime(date: any): string {
  return formatDate(date, "HH:mm:ss");
}

/**
 * 格式化数字
 * @param num 数字值
 * @param precision 小数位数
 * @returns 格式化后的数字字符串
 */
export function formatNumber(num: any, precision: number = 0): string {
  if (num === null || num === undefined || num === "") return "-";

  try {
    const number = Number(num);
    if (isNaN(number)) return String(num);

    return number.toLocaleString("zh-CN", {
      minimumFractionDigits: precision,
      maximumFractionDigits: precision,
    });
  } catch (error) {
    console.warn("数字格式化失败:", error);
    return String(num);
  }
}

/**
 * 相对时间格式化
 * @param date 日期值
 * @returns 相对时间字符串
 */
export function formatRelativeTime(date: any): string {
  if (!date) return "-";

  try {
    const now = new Date();
    const target = new Date(date);
    const diffInMilliseconds = now.getTime() - target.getTime();
    const diffInMinutes = Math.floor(diffInMilliseconds / (1000 * 60));

    if (diffInMinutes < 1) {
      return "刚刚";
    } else if (diffInMinutes < 60) {
      return `${diffInMinutes}分钟前`;
    } else if (diffInMinutes < 1440) {
      return `${Math.floor(diffInMinutes / 60)}小时前`;
    } else if (diffInMinutes < 43200) {
      return `${Math.floor(diffInMinutes / 1440)}天前`;
    } else {
      return formatDate(date);
    }
  } catch (error) {
    return formatDate(date);
  }
}
